package com.UdpRecieve.Netty.server.handler;

import com.UdpRecieve.Netty.protocol.FilePacket;
import com.UdpRecieve.Netty.util.FileBlockClass;
import com.UdpRecieve.tool.Global;
import com.UdpRecieve.tool.SpringUtils;
import com.UdpRecieve.domain.FileOption;
import com.UdpRecieve.domain.FilePigeonhole;
import com.UdpRecieve.mapper.FileOptionMapper;
import com.UdpRecieve.utils.FileUtiles;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;


@ChannelHandler.Sharable
public class FilePacketServerHandler extends SimpleChannelInboundHandler<FilePacket> {

	FileOptionMapper fileOptionMapper = SpringUtils.getBean(FileOptionMapper.class);

	Logger logger = LoggerFactory.getLogger(FilePacketServerHandler.class);
	/**
	 * 创建接受文件块的空文件对象
	 * 秘和非秘 都放到saveRoot目录下
	 * @param ctx
	 * @param packet
	 * @throws Exception
	 */
	@Override
	protected void channelRead0(ChannelHandlerContext ctx, FilePacket packet){

		//生成文件信息辅助类
		FilePigeonhole filePigeonhole = packet.getFilePigeonhole();
		// List<String> fileNames = filePigeonhole.getFileNames();

		filePigeonhole.setFileType("." + filePigeonhole.getFileName().split("\\.")[1]);
		//System.out.println("接受到审批系统的文件对象信息--------------:"+filePigeonhole);
		//TODO 传入的参数认证
		try {
			testFilePigeonhole(filePigeonhole);
		} catch (Exception e) {
			logger.info("参数认证失败!");
			e.printStackTrace();
		}
		//生成文件总长度
		Long fileLength = packet.getFileLength();
		//logger.info("文件总长度--------------:"+fileLength);

		//重新设置接收方
		filePigeonhole.setGetName(FileUtiles.intitPath(filePigeonhole.getGetName()));
		//文件落地
		File fileRoot = fileDownLoad(filePigeonhole.getFileName());
		//生成文件输出流
		FileOutputStream fileOutputStream = null;
		try {
			fileOutputStream = new FileOutputStream(fileRoot);
		} catch (FileNotFoundException e) {
			logger.info("生成文件输出流失败!");
			e.printStackTrace();
		}
		FileBlockClass fileBlockClass = new FileBlockClass();//创建文件块对象
		//设置文件的落地总长度
		fileBlockClass.setFileLength(packet.getFileLength());
		//设置落地文件输出流
		fileBlockClass.setOutputStream(fileOutputStream);
		//设置落地文件的文件辅助类
		fileBlockClass.setFilePigeonhole(filePigeonhole);
		//设置文件传输channel的队列
		String channelId = ctx.channel().id().asLongText();//获取channel的id
		FileReceiveServerHandler.connectBlockList.put(channelId,fileBlockClass);

		packet.setACK(packet.getACK() + 1);
		packet.setFilePigeonhole(null);
		ctx.writeAndFlush(packet);

	}

	/**
	 * 对审批传送过来的参数进行认证
	 * @param filePigeonhole
	 */
	private void testFilePigeonhole(FilePigeonhole filePigeonhole) throws Exception {
		if (filePigeonhole==null){
			throw new Exception("审批传送的filePigeonhole对象为null");
		}
		if (filePigeonhole.getFileType().contains("rar")||filePigeonhole.getFileName().contains(".rar")){
			System.out.println(filePigeonhole.getFileType());
			throw new Exception("fileType有rar");
		}
		if (filePigeonhole.getFileType().contains("zip")&& filePigeonhole.getFileNames()==null){
			System.out.println(filePigeonhole.getFileNames());
			throw new Exception("fileNames为null");
		}
	}


	/**
	 * 加标文件落地方法
	 * 直接放到saveRoot目录下
	 * @param fileName 加标文件名(文件名_加标.后缀)
	 * @return
	 */
	public File fileDownLoad(String fileName){
		//获取配置项
		List<FileOption> fileOptions =  fileOptionMapper.selectFileOptionList(null);
		//获取加标文件根路径
		String saveRoot = fileOptions.get(0).getFileSaveRoot();
		//落地目录(不存在就创建)
		File fileDownLoad = new File(saveRoot);
		if(!fileDownLoad.exists()){
			fileDownLoad.mkdirs();
		}
		//创建落地文件
		File fileDownLoadFile = new File(saveRoot + File.separator + fileName);
		try {
			fileDownLoadFile.createNewFile();
		} catch (IOException e) {
			logger.info("创建落地文件异常");
			e.printStackTrace();
		}
		return fileDownLoadFile;
	}

}
